package zzzhc.image.recognize;

public class TokenUtil {

	public static ImageToken convert(ImageToken token) {
		return convert(token, 9, 9, 0.5d);
	}

	public static ImageToken convert(ImageToken token, int w, int h,
			double emptyRatio) {
		ImageToken result = new ImageToken();
		result.code = token.code;

		result.w = w;
		result.h = h;
		result.data = new int[result.h][result.w];

		int total = token.w * token.h;
		int count = 0;

		for (int y = 0; y < h; y++) {
			for (int x = 0; x < w; x++) {
				int endY = (y + 1) * token.h;
				int endX = (x + 1) * token.w;
				for (int yy = y * token.h; yy < endY; yy++) {
					for (int xx = x * token.w; xx < endX; xx++) {
						int yTemp = yy / h;
						int xTemp = xx / w;
						// if (yTemp>0 && (yy%h*2<h)) {
						// yTemp--;
						// }
						// if (xTemp>0 && (xx%w*2<w)) {
						// xTemp--;
						// }
						if (token.data[yTemp][xTemp] == 0) {
							count++;
						}
					}
				}

				if (count * 1.0d / total > emptyRatio) {
					result.data[y][x] = 0;
				} else {
					result.data[y][x] = 1;
				}
				count = 0;
			}
		}

		// double ratioX = token.w * 1.d / result.w;
		// double ratioY = token.h * 1.d / result.h;
		//
		// int minH = token.h < h ? token.h : h;
		// int minW = token.w < w ? token.w : w;
		//
		// ratioX = ratioX < 1d ? 1 : ratioX;
		// ratioY = ratioY < 1d ? 1 : ratioY;
		//
		// for (int y = 0; y < minH; y++) {
		// for (int x = 0; x < minW; x++) {
		// if (hasEmpty(token, x, y, ratioX, ratioY, emptyRadio)) {
		// result.data[y][x] = 0;
		// } else {
		// result.data[y][x] = 1;
		// }
		// }
		// }

		return result;

	}

	/*
	 * private static boolean hasData(ImageToken token, int x, int y, double
	 * ratioX, double ratioY) { int startX = (int) (x * ratioX); int endX =
	 * (int) Math.round(startX + ratioX); int startY = (int) (y * ratioY); int
	 * endY = (int) Math.round(startY + ratioY);
	 * 
	 * int maxY = (endY > token.h) ? token.h : endY; int maxX = (endX > token.w) ?
	 * token.w : endX;
	 * 
	 * for (int yy = startY; yy < maxY; yy++) { for (int xx = startX; xx < maxX;
	 * xx++) { if (token.data[yy][xx] == 1) { return true; } } } return false; }
	 */

	// private static boolean hasEmpty(ImageToken token, int x, int y,
	// double ratioX, double ratioY, double emptyRadio) {
	// int startX = (int) (x * ratioX);
	// int endX = (int) Math.round(startX + ratioX);
	// int startY = (int) (y * ratioY);
	// int endY = (int) Math.round(startY + ratioY);
	// int maxY = (endY > token.h - 1) ? token.h - 1 : endY;
	// int maxX = (endX > token.w - 1) ? token.w - 1 : endX;
	//
	// int count = 0;
	// int emptyLine = 0;
	// int total = (maxY - startY + 1) * (maxX - startX + 1);
	// for (int yy = startY; yy <= maxY; yy++) {
	// boolean allEmpty = true;
	// for (int xx = startX; xx <= maxX; xx++) {
	// if (token.data[yy][xx] == 0) {
	// count++;
	// } else {
	// allEmpty = false;
	// }
	// }
	// if (allEmpty) {
	// emptyLine++;
	// }
	// }
	// if (emptyLine >= ((maxY - startY + 1) / 2)) {
	// return true;
	// }
	// if ((count * 1.0d / total) > emptyRadio) {
	// return true;
	// } else {
	//			return false;
	//		}
	//	}
}
